package Presentacion.Reportes;

import java.awt.Desktop;
import java.awt.Frame;
import java.awt.print.Paper;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.StringTokenizer;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import org.apache.poi.ss.usermodel.PaperSize;

import Hibernate.Cliente;
import Hibernate.Dueno;
import Hibernate.Presupuesto;
import Hibernate.Vehiculo;
import Logica.ClienteLogica;
import Logica.DuenoLogica;
import Logica.PresupuestoLogica;
import Logica.VehiculoLogica;
import Logica.Validacion.PresupuestoValidacion;
import Logica.Validacion.Validacion;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfWriter;

public class GeneraPresupuesto {

 private BaseFont bfBold;
 private BaseFont bf;
 private int pageNumber = 0;
 private JFileChooser selecciona_archivo;
 private String ruta = "C:/AppCodigoTernario/Reportes/Presupuestos/";
 //72 puntos es una pulgada.
 int xMin, xMax, yMin, yMax;
 public int yLineaDesc;
 int idP;
 
 public GeneraPresupuesto(int idPresupuesto) {
	super();
	this.idP = idPresupuesto;
	//margenes
	xMin = 72;
	yMin = 72;

	boolean existe = false;
	String strFichero, pdfFilename, patente, fecha;
	File file;
	Frame frame = null;
//	do{
	Presupuesto p = PresupuestoLogica.getByid(idPresupuesto);
	fecha = Validacion.getFechaActual();
	patente = DuenoLogica.getById(p.getIdduenio()).getPatente()+"-"+fecha;
//		pdfFilename = "";
//		selecciona_archivo = new JFileChooser();
//		selecciona_archivo.showSaveDialog(null);
//		pdfFilename = selecciona_archivo.getSelectedFile().toString();
//		  
////		  if (args.length == 1)
////		  {
////		   System.err.println("Usage: java "+ this.getClass().getName()+
////		   " PDF_Filename");
////		   System.exit(1);
////		  }
//
////		  pdfFilename = args[0].trim();
		strFichero = ruta+patente+".pdf";
		file = new File(strFichero);
		existe = file.exists();
		
		if (existe){
			strFichero = ruta+"(1)"+patente+".pdf";
		}
//	}while (existe);
	
	
	  this.createPDF(strFichero);
	  this.abrirarchivo(strFichero);
	  
}

public static void main() {
   GeneraPresupuesto gi = new GeneraPresupuesto(4);

 }

 private void createPDF (String pdfFilename){

  Document doc = new Document();
  PdfWriter docWriter = null;
  initializeFonts();

  try {
   String path = pdfFilename;
   docWriter = PdfWriter.getInstance(doc , new FileOutputStream(path));
   doc.addAuthor("Centis, Luciano");
   doc.addCreationDate();
   doc.addProducer();
   doc.addCreator("Código Ternario");
   doc.addTitle("Presupuesto");   
   doc.setPageSize(PageSize.A4);
   doc.open();
   PdfContentByte cb = docWriter.getDirectContent();
   
   boolean beginPage = true;
   yLineaDesc = 0;
//   int y = 0;
   
//   for(int i=0; i < 9; i++ ){
	    if(beginPage){
		     beginPage = false;
		     generateLayout(doc, cb); 
		     generateHeader(doc, cb);
//		     y = 585; 
		     yLineaDesc = 585;
	    }
	    generateDetail(doc, cb);
	    yLineaDesc -= 15;
	    if(yLineaDesc < 30){
		     printPageNumber(cb);
		     doc.newPage();
		     beginPage = true;
	    }
//   }
   printPageNumber(cb);

  }
  catch (DocumentException dex)
  {
	  dex.printStackTrace();
  }
  catch (Exception ex)
  {
	  ex.printStackTrace();
  }
  finally
  {
	   if (doc != null)
	   {
		   doc.close();
	   }
	   if (docWriter != null)
	   {
		   docWriter.close();
	   }
  }
 }

 private void generateLayout(Document doc, PdfContentByte cb)  {

  try { //DIBUJO CONTORNO DE PRESUPUESTO

   cb.setLineWidth(1f);
   int xIni, yIni, xSize, ySize;
   xSize = 500;
   ySize = 120;
   xIni = 50;
   yIni = 700;
   // Invoice Header box layout

   //rectangulo encabezado
   cb.rectangle(xIni,yIni,xSize,ySize);
   cb.moveTo((xIni + xSize/2 - 15), yIni);
   cb.lineTo((xIni + xSize/2 - 15), yIni+ySize);
   cb.moveTo((xIni + xSize/2 + 30), yIni);
   cb.lineTo((xIni + xSize/2 + 30), yIni+ySize);

   //espacio entre encabezado y datos de cliente y vehiculo
   cb.stroke();
   yIni -= 3; 
   ySize = 50;
   yIni -= ySize;
   
   cb.rectangle(xIni,yIni,xSize,ySize);

   // tamaño cuerpo del reporte
   yIni -= 3;
   ySize = 170;
   yIni -= ySize;
   
   //rectangulo cuerpo del reporte
   cb.rectangle(xIni,yIni,xSize,ySize);
   xIni += 45;
   cb.moveTo(xIni, yIni);
   cb.lineTo(xIni, ySize+yIni);
   xIni += 400;
   cb.moveTo(xIni, yIni);
   cb.lineTo(xIni, ySize+yIni);
   int yH = ySize + yIni - 20;
   int xH = 50;
   cb.moveTo(xH, yH);
   cb.lineTo(xH + xSize, yH);
   yH -= ySize - 40;
   cb.moveTo(xH, yH);
   cb.lineTo(xH + xSize, yH);
   
   //linea de la firma
   yH -= 50;
   xH += 400;
   cb.moveTo(xH, yH);
   cb.lineTo(xH + 100, yH);
   
   cb.stroke();

   // Invoice Detail box Text Headings COLUMNAS DETALLES PRESUPUESTO
   int y = 610;
   createHeadings(cb,54,y,"Cantidad");
   createHeadings(cb,100,y,"Descripción");
   createHeadings(cb,500,y,"Precio");

   //add the images
//   Image companyLogo = Image.getInstance("src/Pruebas/olympics_logo.gif");
//   companyLogo.setAbsolutePosition(25,700);
//   companyLogo.scalePercent(25);
//   doc.add(companyLogo);
  } //catch de la carga de imagen
//  catch (DocumentException dex){
//   dex.printStackTrace();
//  }
  catch (Exception ex){
   ex.printStackTrace();
  }

 }
 
 private void generateHeader(Document doc, PdfContentByte cb)  {

  try { //GENERAR ENCABEZADO DE PRESUPUESTO.
	  int xPr, yPr;
	  xPr = 55;  
   createHeadings(cb,xPr,780,"Electrónica Mitre");
   createHeadings(cb,xPr,765,"Mitre 721");
   createHeadings(cb,xPr,750,"Malabrigo (Santa Fe)");
   createHeadings(cb,xPr,735,"CP 3572");
   createHeadings(cb,xPr,720,"03482-15500444");
  
   String date = Validacion.getFechaActualPresupuesto();
   createHeadings(cb,500,785,date);
   
   createHeadings(cb,xPr,680,"Cliente:");
   createHeadings(cb,xPr,660,"Dirección:");
   xPr = 300;
   createHeadings(cb,xPr,680,"Vehículo:");
   createHeadings(cb,xPr,660,"Fecha emisión:");
   xPr = 350;
   createHeadings(cb,xPr,770,"* Inyección electrónica.");
   createHeadings(cb,xPr,755,"* Escaneo - diagnóstico.");
   createHeadings(cb,xPr,740,"* Motores de arranque.");
   createHeadings(cb,xPr,725,"* Alternadores.");
   xPr = 460;
   createHeadings(cb,xPr,480,"Total:");
   xPr = 490;
   createHeadings(cb,xPr,430,"Firma");
   
   
   xPr = 305;
   yPr = 810;
   int descuento = 10;
   createHeadings(cb, xPr, yPr, "P"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "R"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "E"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "S"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "U"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "P"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "U"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "E"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "S"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "T"); yPr -= descuento;
   createHeadings(cb, xPr, yPr, "O"); 
  }

  catch (Exception ex){
   ex.printStackTrace();
  }

 }
 
 private void generateDetail(Document doc, PdfContentByte cb)  {
  DecimalFormat df = new DecimalFormat("0.00");
  
  Presupuesto p;
  p = PresupuestoLogica.getByid(idP);
  Dueno d = DuenoLogica.getById(p.getIdduenio());
  Cliente c = ClienteLogica.getById(d.getIdcliente());
  Vehiculo v = VehiculoLogica.getById(d.getIdvehiculo());
  
  try {	 
	  String nomYAp = c.getApellido()+", "+c.getNombre();
	  String dir = c.getDireccion();
	  String vehiculo = v.getMarca()+", "+v.getModelo()+", "+d.getPatente();
	  
	  //inserto datos de cliente
	  createContent(cb, 100, 680, nomYAp, PdfContentByte.ALIGN_LEFT);
	  createContent(cb, 100, 660, dir, PdfContentByte.ALIGN_LEFT);	  
	  createContent(cb, 360, 680, vehiculo, PdfContentByte.ALIGN_LEFT);
	  createContent(cb, 360, 660, p.getFechaemision().toString(), PdfContentByte.ALIGN_LEFT);
	  
	  int xIni;	  
	  xIni = 110;
	  		  
	  int price = p.getImporte();
	  createContent(cb, 70, yLineaDesc, "1", PdfContentByte.ALIGN_LEFT);
	  createContent(cb,510,yLineaDesc, df.format(price),PdfContentByte.ALIGN_LEFT);
	  createContent(cb,510,480, df.format(price),PdfContentByte.ALIGN_LEFT);
	  
	  String str= p.getTrabajos();
	  StringTokenizer token = new StringTokenizer(str);
	  String aux, word;
	  aux = "";
		  
	  while (token.hasMoreElements()) {
		  do{
			  word = token.nextElement().toString();
			  System.out.println(word);
			  
			  aux += " "+word.toString();
			  	
		  }				  
	  while((aux.length()+word.length()+1 < 100) && token.hasMoreElements());
		  createContent(cb,xIni,yLineaDesc,aux,PdfContentByte.ALIGN_LEFT);		
			  
	      yLineaDesc -= 15;
		  aux = "";				
		}      
  }

  catch (Exception ex){
   ex.printStackTrace();
  }

 }

 private void createHeadings(PdfContentByte cb, float x, float y, String text){
  cb.beginText();
  cb.setFontAndSize(bfBold, 8);
  cb.setTextMatrix(x,y);
  cb.showText(text.trim());
  cb.endText(); 
 }
 
 private void printPageNumber(PdfContentByte cb){


//  cb.beginText();
//  cb.setFontAndSize(bfBold, 8);
//  cb.showTextAligned(PdfContentByte.ALIGN_RIGHT, "Pagina N°. " + (pageNumber+1), 570 , 390, 0);
//  cb.endText(); 
//  
//  pageNumber++;
//  
 }
 
 private void createContent(PdfContentByte cb, float x, float y, String text, int align){


  cb.beginText();
  cb.setFontAndSize(bf, 8);
  cb.showTextAligned(align, text.trim(), x , y, 0);
  cb.endText(); 

 }

 private void initializeFonts(){


  try {
   bfBold = BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
   bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);

  } catch (DocumentException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
 }

 
 public void abrirarchivo(String archivo){
     try {  File objetofile = new File (archivo);
            Desktop.getDesktop().open(objetofile);
     }catch (IOException ex) {
            System.out.println(ex);
     }
   }
 
 
}
